<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="box">组合继承</div>
</body>
<script>

// 组合继承 = 原型链继承+ 构造函数继承

function Father(name,age){
   
    this.name = [name]
   
    this.age = age
    this.hubby = '打游戏'
    this.sing = function(){
        console.log('会唱歌');
    }

}
Father.prototype.fn = function(){
    console.log('我是父类原型上的方法');
}
// 构造函数继承
function Son(name,age,sex){
    Father.call(this,name,age,sex)
}
// 原型链继承
Son.prototype = new Father()
let son = new Son('张三',18,'男')
let son1 = new Son('李四',19,'女')
console.log(son);
console.log(son1);


// 子类的引用类型不会互相影响  一个改变不会对另一个有影响
son.name.push('王五')
console.log(son.name);
console.log(son1.name);

// 组合继承  子构造函数 可以继承父的原型上的方法，子类参数可以传递给父类的构造函数


// es6 class类继承 extends继承  super方法 更改this指向  复制父类的方法
// 原型链继承  把父类实例化的对象赋值 给子类的原型   （缺点：实例化出来的子类不能将参数传递给父类）
// 构造函数继承 使用call或者apply方法，将父类的构造函数绑定在子类实例化对象（缺点：子类无法继承父类构造函数原型上的方法）
// 组合继承： 原型链继承+ 构造函数继承  
// 注意：：：子类的引用类型不会互相影响  一个改变不会对另一个有影响


</script>
</html>